/*
 * Copyright (C) 2024, Ingenic Semiconductor Co.,Ltd.
 * Author: Keven <keven.ywhan@ingenic.com>
 */

#ifndef __GPIO_H__
#define __GPIO_H__

#define GPIO_PXINTC(n)   ((volatile unsigned int *)(GPIO_BASE + (0x018 + (n)*0x1000))) /* PORT Interrupt Clear Register */
#define GPIO_PXMASKC(n)  ((volatile unsigned int *)(GPIO_BASE + (0x028 + (n)*0x1000))) /* PORT Interrupt Mask Clear Register */
#define GPIO_PXPAT1C(n)  ((volatile unsigned int *)(GPIO_BASE + (0x038 + (n)*0x1000))) /* PORT Pattern 1 Clear Register */
#define GPIO_PXPAT0C(n)  ((volatile unsigned int *)(GPIO_BASE + (0x048 + (n)*0x1000))) /* PORT Pattern 0 Clear Register */
#define GPIO_PXPUENC(n)  ((volatile unsigned int *)(GPIO_BASE + (0x118 + (n)*0x1000))) /* PORT Pull-up State Clear Register0 */
#define GPIO_PXPDENC(n)  ((volatile unsigned int *)(GPIO_BASE + (0x128 + (n)*0x1000))) /* PORT Pull-down State Clear Register1 */
#define GPIO_PXPAT0S(n)  ((volatile unsigned int *)(GPIO_BASE + (0x044 + (n)*0x1000))) /* PORT Pattern 0 Set Register */
#define GPIO_PXPUENS(n)  ((volatile unsigned int *)(GPIO_BASE + (0x114 + (n)*0x1000))) /* PORT Pull-up State Set Register0 */

/*
 * PB23:UART1_TXD,PB24:UART1_RXD,FUNC0
 */
#define __gpio_b_as_uart1()			\
do {					\
	*GPIO_PXINTC(1)  = 0x01800000;	\
	*GPIO_PXMASKC(1) = 0x01800000;	\
	*GPIO_PXPAT1C(1) = 0x01800000;	\
	*GPIO_PXPAT0C(1) = 0x01800000;	\
	*GPIO_PXPUENC(1) = 0x01800000;	\
	*GPIO_PXPDENC(1) = 0x01800000;	\
} while (0)
/*
 * PC8:UART0_TXD,PC9:UART0_RXD,FUNC0
 */
#define __gpio_c_as_uart0()			\
do {						\
	*GPIO_PXINTC(2)  = 0x00000300;	\
	*GPIO_PXMASKC(2) = 0x00000300;	\
	*GPIO_PXPAT1C(2) = 0x00000300;	\
	*GPIO_PXPAT0C(2) = 0x00000300;	\
	*GPIO_PXPUENC(2) = 0x00000300;	\
	*GPIO_PXPDENC(2) = 0x00000300;	\
} while (0)
/*
 * PB19 PB22
 */
#define __gpio_b_as_uart0()			\
do {						\
	*GPIO_PXINTC(1)  =  0x00480000;	\
	*GPIO_PXMASKC(1) =  0x00480000;	\
	*GPIO_PXPAT1C(1) =  0x00480000;	\
	*GPIO_PXPAT0C(1) =  0x00480000;	\
	*GPIO_PXPUENC(1) =  0x00480000;	\
	*GPIO_PXPDENC(1) =  0x00480000;	\
} while (0)


/* ############################ for sfc0 boot ############################### */
/*
 * PA[23-28]:SFC_DT,SFC_DR,SFC_HOLD(PU),SFC_WP,SFC_CLK,SFC_CE(PU)(FUNC1;PU-25,PU-28)
 */
#define __gpio_a_as_sfc0_boot()		\
do {					\
	*GPIO_PXINTC(0)  = 0x1f800000;	\
	*GPIO_PXMASKC(0) = 0x1f800000;	\
	*GPIO_PXPAT1C(0) = 0x1f800000;	\
	*GPIO_PXPAT0S(0) = 0x1f800000;	\
	*GPIO_PXPUENS(0) = 0x1f800000;	\
	*GPIO_PXPDENC(0) = 0x1f800000;	\
} while (0)

/* ############################ for sfc1 boot ############################### */
/*
 * SFC_DT(PA20),SFC_DR(PA21),SFC_CLK(PA22),
 * SFC_CE(PA29 PU),SFC_WP(PA30),SFC_HOLD(PA31 PU)
 * (PU:PXPUEN=1, PXPDEN=0,func1)
 */

#define __gpio_a_as_sfc1_boot()		\
do {					\
	*GPIO_PXINTC(0)  = 0xE0700000;	\
	*GPIO_PXMASKC(0) = 0xE0700000;	\
	*GPIO_PXPAT1C(0) = 0xE0700000;	\
	*GPIO_PXPAT0S(0) = 0xE0700000;	\
	*GPIO_PXPUENS(0) = 0xE0700000;	\
	*GPIO_PXPDENC(0) = 0xE0700000;	\
} while (0)

/* ############################ for msc boot ############################### */
#define __gpio_b_as_msc0_1bit()		\
do {                                    \
        *GPIO_PXINTC(1)  = 0x00000031;  \
        *GPIO_PXMASKC(1) = 0x00000031;  \
        *GPIO_PXPAT1C(1) = 0x00000031;  \
        *GPIO_PXPAT0C(1) = 0x00000031;  \
        *GPIO_PXPUENC(1) = 0x00000031;	\
        *GPIO_PXPDENC(1) = 0x00000031;  \
} while (0)

#define __gpio_b_as_msc0_4bit()		\
do {                                    \
        *GPIO_PXINTC(1)  = 0x0000003f;  \
        *GPIO_PXMASKC(1) = 0x0000003f;  \
        *GPIO_PXPAT1C(1) = 0x0000003f;  \
        *GPIO_PXPAT0C(1) = 0x0000003f;  \
        *GPIO_PXPUENC(1) = 0x0000003f; \
        *GPIO_PXPDENC(1) = 0x0000003f;  \
} while (0)

#endif /* __PINCTRL_H__ */
